// 类型声明的方法，const 变量:类型 = '值'
const heima: string = 'heima';
// 定义一个布尔类型
const isTrue: boolean = true;
// 定义一个数字类型
const count: number = 123;
// 定义数组
const arr: Array<number> = [1, 2, 3];
// 定义数组第二种方法
const arr2: number[] = [1, 2, 3];

// 枚举类型

// 如果不通过枚举方式定义，会很容易导致代码难理解
// if (orderType === 1){
//     // 全部订单
// } else if (orderType === 2) {
//     // 待付款
// }

// 使用枚举方式实现
enum OrderType {
    allOrder, pay, other
}

if (OrderType.allOrder) {

} else if (OrderType) {

}

// any类型定义
// let notSure: string = 'notSure';
// notSure = 123;
// any 注意不要滥用
let notSure: any = 'notSure';
notSure = 123;
notSure = true;

// void关键字，表示函数没有返回
function demo1(): void {
    console.log("demo1 run")
}
function demo2(): number {
  return 123;
}

function demo3(name: string, age: number): void {
    console.log(name, age)
}

demo3('tom', 18)

// 类型推断
const someValue: any = '这是一个字符串';
// 通过<string>关键字把any的类型声明为一个特定类型
(<string>someValue).length;
// 也可以用as关键字转换
(someValue as string).length;



// 通过接口的形式定义对象
interface UserType {
    name: string,
    age: number,
    nickName?: string // 可选参数
}

// 对象类型的判断
// function getUser(user: { name: string, age: number }) {

// }
function getUser(user: UserType) {

}

getUser({ name: 'tom', age: 123 });

// 只读属性
interface ProductType {
    name: string,
    readonly price: number
}

const procuct: ProductType = { name: '商品名字', price: 1000 };
// procuct.price = 2000; // 如果重新赋值，会出现报错

// 泛型
function identity<T>(arg: T) {
    console.log(arg);
}
identity<string>('name')